package com.atguigu.juc.chap08;

import java.util.concurrent.*;

/**
 * @author Taeyang
 * @date 2025/4/3
 */
public class CustomizeThreadPoolDemo {
    public static void main(String[] args) {
        // 手动创建线程池，阿里开发规范推荐
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                2,
                5,
                2,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                // 拒绝策略：
                // 1.直接抛出RejectedExecutionException异常阻止系统正常运行
                // new ThreadPoolExecutor.AbortPolicy()
                // 2.“调用者运行”一种调节机制，该策略既不会抛弃任务，也不会抛出异常，而是将某些任务回退到调用者，从而降低新任务的流量。
                // new ThreadPoolExecutor.CallerRunsPolicy()
                // 3.抛弃队列中等待最久的任务，然后把当前任务加人队列中，尝试再次提交当前任务。
                // new ThreadPoolExecutor.DiscardOldestPolicy()
                // 4.默默地丢弃无法处理的任务，不予任何处理也不抛出异常。 如果允许任务丢失，这是最好的一种策略。
                // new ThreadPoolExecutor.DiscardOldestPolicy()
                // 5.自定义拒绝策略
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                        System.out.println("俺不中嘞");
                    }
                }
        );

        try {
            for (int i = 1; i <= 9; i++) {
                threadPoolExecutor.execute(new MyRunnableThread(i));
            }
        } finally {
            threadPoolExecutor.shutdown();
        }

    }
}

class MyRunnableThread implements Runnable {

    private int num;

    public MyRunnableThread(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 执行任务" + num);
    }
}
